﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;

namespace ConsoleApp1
{
    class Program
    {
        public static Dictionary<int, Student> dt = new Dictionary<int, Student>();
        static void Main(string[] args)
        {
            /*
               添加3个类，分别实现 IComparer<T>接口，实现对Student类的三个字段的排序。
              1、学生类：学号、姓名、年龄
              2、请选择：1、添加学生信息。2、查询学生信息，3、删除学生信息。
              3、重复的学号不能添加。
              4、查询学生信息功能中有：1、查询所有（按学号排序）2、查询所有（按姓名排序），3、查询所有（按年龄排序）
                                        4、按学号查询（查没有，则打印查无此学生）5、退出
              */
            Student stu1 = new Student(3, "张楚岚", 19);
            Student stu2 = new Student(2,"诸葛青", 23);
            Student stu3 = new Student(1, "王也",21 );
            List<Student> list = new List<Student>() { stu1,stu2,stu3};
            Console.WriteLine("排序前");
            foreach (Student stu in list)
            {
                Console.WriteLine(stu.stuid + "" + stu.name + stu.age.ToString());
            }
            Console.WriteLine("请选择：1. 按学号排序；2. 按姓名排序；3. 按年龄排序");
            string select = Console.ReadLine();
            //选择后，生成相应的排序对象
            switch (select)
            {
                case "1":
                    //按照学号
                    list.Sort(new StuidSort());
                    break;
                case "2":
                    //按照姓名
                    list.Sort(new NameSort());
                    break;
                case "3":
                    //按照年龄
                    list.Sort(new AgeSort());
                    break;
            }
            Console.WriteLine("排序后");
            foreach (Student stu in list)
            {
                Console.WriteLine(stu.stuid + stu.name + "" + stu.age .ToString());
            }
            ///分割线分割线分割线分割线分割线分割线分割线分割线分割线
            while (true)
            {
                Sw();
                Console.ReadKey();
            }
        }
        private static void Sw()
        {
            Console.WriteLine("请选择：1、添加学生信息。2、查询学生信息，3、删除学生信息");
            int key = int.Parse(Console.ReadLine());
            switch (key)
            {
                case 1:
                    Test1();
                    break;
                case 2:
                    Test2();
                    break;
                case 3:
                    Test3();
                    break;
                default:
                    break;
            }
        }
        private static void Test3()
        {
            Console.WriteLine("请输入你要删除学生信息的学号");
            int a = int.Parse(Console.ReadLine());
            if (dt.ContainsKey(a))
            {
                dt.Remove(a);
                Console.WriteLine("删除成功！！！");
            }
            else
            {
                Console.WriteLine("没有找到该学号的学生信息");
            }
            Sw();
        }

        private static void Test1()
        {
            while (true)
            {
                Console.WriteLine("请输入学号");
                int a = int.Parse(Console.ReadLine());
                if (!dt.ContainsKey(a))
                {
                    Console.WriteLine("请输入姓名");
                    string b = Console.ReadLine();
                    Console.WriteLine("请输入年龄");
                    int c = int.Parse(Console.ReadLine());
                    Student stu = new Student(a, b, c);
                    dt.Add(a, stu);
                    Console.WriteLine("添加成功！！！");
                    Sw();
                }
                else
                {
                    Console.WriteLine("学号已存在");
                }
            }

        }
        private static void Test2()
        {
            Console.WriteLine("1、查询所有（按学号排序）2、查询所有（按姓名排序），3、查询所有（按年龄排序）4、按学号查询（查没有，则打印查无此学生）5、退出");
            int key = int.Parse(Console.ReadLine());
            switch (key)
            {
                case 1:
                    SortStuid();
                    Test2();
                    break;
                case 2:
                    SortName();
                    Test2();
                    break;
                case 3:
                    SortAge();
                    Test2();
                    break;
                case 4:
                    aNumSort();
                    Test2();
                    break;
                case 5:
                    Sw();
                    Console.WriteLine("退出成功！！！");
                    break;
                default:
                    break;
            }
        }

        private static void aNumSort()
        {
            Console.WriteLine("请输入学号");
            int a = int.Parse(Console.ReadLine());
            if (dt.ContainsKey(a))
            {
                Console.WriteLine(dt[a]);
            }
            else
            {
                Console.WriteLine("没有找到该学号");
            }
        }

        private static void SortAge()
        {
            List<Student> list = new List<Student>();
            foreach (var item in dt.Values)
            {
                list.Add(item);
            }
            list.Sort(new AgeSort());
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
        }

        private static void SortName()
        {
            List<Student> list = new List<Student>();
            foreach (var item in dt.Values)
            {
                list.Add(item);
            }
            list.Sort(new NameSort());
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
        }

        private static void SortStuid()
        {
            List<Student> list = new List<Student>();

            foreach (var item in dt.Values)
            {
                list.Add(item);
            }
            list.Sort(new StuidSort());
            foreach (var item in list)
            {
                Console.WriteLine(item);
            }
        
        Console.ReadKey();
        }

        ///
        public class Student
        {
            public int stuid;
            public string name;
            public int age;

            public Student(int Stuid, string Name, int Age)
            {
                this.stuid = Stuid;
                this.name = Name;
                this.age = Age;
            }
            public int Stuid { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }

            public override string ToString()
            {
                return $"学号{Stuid}，姓名{Name}，年龄{Age}";
            }
        }

        //按照学号
        public class StuidSort : IComparer<Student>
        {
            public int Compare(Student x, Student y)
            {
                return x.stuid.CompareTo(y.stuid);
            }
        }
        //按照名字
        public class NameSort : IComparer<Student>
        {
            public int Compare(Student x, Student y)
            {
                return x.name.CompareTo(y.name);
            }
        }
        //按照年龄
        public class AgeSort : IComparer<Student>
        {
            public int Compare(Student x, Student y)
            {
                return x.age.CompareTo(y.age);
            }
        }
    }
}